/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXController;
import jp.ize.ux.UXInteraction;
import jp.ize.ux.UXFocusManager;
import jp.ize.ux.states.UXBasicState;
import jp.ize.ux.geom.UXSize;
import jp.ize.ux.utils.UXRange;
import jp.ize.ux.acts.Act;
import jp.ize.ux.components.UXComponent;
import jp.ize.ux.components.UXResource;
import jp.ize.ux.interactions.UXGeneralInteraction;

#if flash9
import flash.events.FocusEvent;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
#elseif flash
import flash.TextField;
#end
// }}}
// {{{ class UXTextFieldResource extends UXComponentResource
/**
 * UXTextFieldResource クラス<br>
 * UXTextFieldコンポーネントに利用されるリソース群です。
 */
class UXTextFieldResource extends UXComponentResource
{
	// {{{ public var background(default, default) : UXObject
	/**
	 * 背景となるコンポーネントです。
	 */
	public var background(default, default) : UXObject;
	// }}}
}
// }}}
// {{{ class UXTextFieldCoState
class UXTextFieldCoState
{
	// {{{ public var focused(default, default) : Bool
	/**
	 * このボタンにフォーカスが当たっているかどうかを取得、または設定します。
	 */
	public var focused(default, default) : Bool;
	// }}}
	// {{{ public var highlighted(default, default) : Bool
	/**
	 * このボタンがハイライトされているかどうかを取得、または設定します。
	 */
	public var highlighted(default, default) : Bool;
	// }}}
}
// }}}
// {{{ enum UXTextFieldExclusiveState
/**
 * UXTextFieldの各種状況を表現します。
 */
enum UXTextFieldExclusiveState
{
	/** 初期化状態にある事を意味します。*/
	INIT;
	/** 無効になっている事を意味します。*/
	DISABLE;
	/** 有効になっている事を意味します。パラメーターでは、フォーカスやハイライトの状況を保持します。*/
	ENABLE ( flags : UXTextFieldCoState );
}
// }}}
// {{{ enum UXTextAlign
enum UXTextAlign
{
	CENTER;
	JUSTIFY;
	LEFT;
	RIGHT;
}
// }}}
// {{{ class UXTextFieldAct extends Act
/**
 * UXTextFieldAct クラス<br>
 * UXTextFieldのデフォルトアクションです。
 */
class UXTextFieldAct extends Act
{
	// {{{ public function new()
	/**
	 * コンストラクタです。<br>
	 */
	public function new()
	{
		super();
	}
	// }}}
	// {{{ public function uplight() : UXTextFieldState -> Void
	/**
	 * ボタンをハイライトした時のデフォルトアクションです。
	 */
	public function uplight() : UXTextFieldState -> Void
	{
		return function( s : UXTextFieldState ) {
		}
	}
	// }}}
	// {{{ public function downlight() : UXTextFieldState -> Void
	/**
	 * ボタンのハイライトを解除した時のデフォルトアクションです。
	 */
	public function downlight() : UXTextFieldState -> Void
	{
		return function( s : UXTextFieldState ) {
		}
	}
	// }}}
	// {{{ public function focus() : UXTextFieldState -> Void
	/**
	 * ボタンがフォーカスされた時のデフォルトアクションです。
	 */
	public function focus() : UXTextFieldState -> Void
	{
		return function( s : UXTextFieldState ) {
		}
	}
	// }}}
	// {{{ public function unfocus() : UXTextFieldState -> Void
	/**
	 * ボタンのフォーカスが解除された時のデフォルトアクションです。
	 */
	public function unfocus() : UXTextFieldState -> Void
	{
		return function( s : UXTextFieldState ) {
		}
	}
	// }}}
	// {{{ public function show() : UXTextFieldState -> Void
	/**
	 * 表示状態になった時のデフォルトアクションです。
	 */
	public function show() : UXTextFieldState -> Void
	{
		return function( s : UXTextFieldState ) {
		}
	}
	// }}}
	// {{{ public function hide() : UXTextFieldState -> Void
	/**
	 * 非表示状態になった時のデフォルトアクションです。
	 */
	public function hide() : UXTextFieldState -> Void
	{
		return function( s : UXTextFieldState ) {
		}
	}
	// }}}
}
// }}}
// {{{ class UXTextFieldState extends UXBasicState
/**
 * UXTextFieldState クラス<br>
 * UXTextFieldの現在の状態を表すオブジェクトです。
 */
class UXTextFieldState extends UXBasicState
{
	// {{{ properties


	// }}}
	// {{{ public var resource( default, default ) : UXTextFieldResource;
	/**
	 * テキストフィールドの描画に使用するリソースです。
	 */
	public var resource( default, default ) : UXTextFieldResource;
	// }}}
	// {{{ public var field : TextField;
	/**
	 * テキストフィールドを示します。
	 */
	public var field : TextField;
	// }}}
	// {{{ public var selection(default, default) : UXRange;
	/**
	 * テキストの現在の選択範囲を示します。
	 */
	public var selection(default, default) : UXRange;
	// }}}
	// {{{ public var displayAsPassword(default, default) : Bool;
	/**
	 * テキストフィールドがパスワードテキストフィールドであるかどうかを設定します。
	 */
	public var displayAsPassword(default, default) : Bool;
	// }}}
	// {{{ public var condition( default, default) : UXTextFieldExclusiveState;
	/**
	 * enableかどうかやフォーカスが当たっているかなど各種状況を保持する変数です。
	 */
	public var condition( default, default) : UXTextFieldExclusiveState;
	// }}}
	// {{{ public var act(default, null) : UXTextFieldAct
	/**
	 * デフォルトの動きです。
	 */
	public var acts(default, null) : UXTextFieldAct;
	// }}}
	// {{{ public var focusManager(default, default) : UXFocusManager
	/**
	 * このコンポーネントが属するフォーカスグループの管理オブジェクトです。
	 * このコンポーネントがフォーカスを受け取らない場合はnullです。
	 */
	public var focusManager(default, default) : UXFocusManager;
	// }}}
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		super();
		// 
		// TODO
		// リソースの設定
		// デフォルト値の設定
	}
	// }}}
	// {{{ private function attachResource() : Void
	/**
	 * テキストフィールドに対するグローバルなリソースをresourceプロパティに取得する関数です。
	 */
	private function attachResource() : Void
	{
	}
	// }}}
}
// }}}

// {{{ class UXTextField extends UXComponent<UXTextFieldState>
/** 
 * UXTextField クラス<br>
 * テキスト入力用のコンポーネントクラスです。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id: UXTextField.hx 20 2009-02-04 08:23:19Z yimai.v $<br>
 */
class UXTextField extends UXComponent<UXTextFieldState>
{
	// {{{ properties

	public var field:TextField;

	// {{{ public var text(getText, setText) : String;
	/**
	 * テキストフィールド内の現在のテキストを示します。
	 */
	public var text(getText, setText) : String;
	// }}}
	// {{{ public var textColor(getTextColor, setTextColor) : Int;
	/**
	 * テキストフィールド内の現在のテキストカラーを示します。
	 */
	public var textColor(getTextColor, setTextColor) : Int;
	// }}}
	// {{{ public var size(getSize, setSize) : Float;
	/**
	 * テキストフィールド内の現在のフォントサイズを示します。
	 */
	public var size(getSize, setSize) : Float;
	// }}}
	// {{{ public var bold(getBold, setBold) : Bool;
	/**
	 * テキストフィールド内の現在のボールド状態を示します。
	 */
	public var bold(getBold, setBold) : Bool;
	// }}}
	// {{{ public var italic(getItalic, setItalic) : Bool;
	/**
	 * テキストフィールド内の現在のイタリック状態を示します。
	 */
	public var italic(getItalic, setItalic) : Bool;
	// }}}
	// {{{ public var underline(getUnderline, setUnderline) : Bool;
	/**
	 * テキストフィールド内の現在のボールド状態を示します。
	 */
	public var underline(getUnderline, setUnderline) : Bool;
	// }}}
	// {{{ public var align(getAlign, setAlign) : UXTextAlign;
	/**
	 * テキストフィールド内の現在のボールド状態を示します。
	 */
	public var align(getAlign, setAlign) : UXTextAlign;
	// }}}
	// {{{ public function getText() : String
	/**
	 * 表示しているテキストを返します。
	 */
	public function getText() : String
	{
		return field.text;
	}
	// }}}
	// {{{ public function setText( s : String ) : String
	/**
	 * 表示するテキストを設定します。
	 */
	public function setText( s : String ) : String
	{
		return field.text = s;
	}
	// }}}
	// {{{ public function getTextColor() : Int
	/**
	 * 表示しているテキストカラーを返します。
	 */
	public function getTextColor() : Int
	{
		return field.textColor;
	}
	// }}}
	// {{{ public function setTextColor( s : Int ) : Int
	/**
	 * 表示するテキストカラーを設定します。
	 */
	public function setTextColor( c : Int ) : Int
	{
		return field.textColor = c;
	}
	// }}}
	// {{{ public function getSize() : Float
	/**
	 * 表示しているフォントサイズを返します。
	 */
	public function getSize() : Float
	{
		var fm = field.getTextFormat();
		return fm.size;
	}
	// }}}
	// {{{ public function setSize( s : Float ) : Float
	/**
	 * 表示するフォントサイズを設定します。
	 */
	public function setSize( s : Float ) : Float
	{
		var fm = field.getTextFormat();
		return fm.size = s;
	}
	// }}}
	// {{{ public function getBold() : Bool
	/**
	 * 表示しているボールド状態を返します。
	 */
	public function getBold() : Bool
	{
		var fm = field.getTextFormat();
		return fm.bold;
	}
	// }}}
	// {{{ public function setBold( s : Bool ) : Bool
	/**
	 * 表示するボールド状態を設定します。
	 */
	public function setBold( s : Bool ) : Bool
	{
		var fm = field.getTextFormat();
		return fm.bold = s;
	}
	// }}}
	// {{{ public function getItalic() : Bool
	/**
	 * 表示しているイタリック状態を返します。
	 */
	public function getItalic() : Bool
	{
		var fm = field.getTextFormat();
		return fm.italic;
	}
	// }}}
	// {{{ public function setItalic( s : Bool ) : Bool
	/**
	 * 表示するイタリック状態を設定します。
	 */
	public function setItalic( s : Bool ) : Bool
	{
		var fm = field.getTextFormat();
		return fm.italic = s;
	}
	// }}}
	// {{{ public function getUnderline() : Bool
	/**
	 * 表示しているアンダーライン状態を返します。
	 */
	public function getUnderline() : Bool
	{
		var fm = field.getTextFormat();
		return fm.underline;
	}
	// }}}
	// {{{ public function setUnderline( s : Bool ) : Bool
	/**
	 * 表示するアンダーライン状態を設定します。
	 */
	public function setUnderline( s : Bool ) : Bool
	{
		var fm = field.getTextFormat();
		return fm.underline = s;
	}
	// }}}
	// {{{ public function getAlign() : UXTextAlign
	/**
	 * 表示しているアライン状態を返します。
	 */
	public function getAlign() : UXTextAlign
	{
		var fm = field.getTextFormat();
		var align = null;
		switch ( fm.align ) {
			case TextFormatAlign.CENTER:
				align = CENTER;
			case TextFormatAlign.JUSTIFY:
				align = JUSTIFY;
			case TextFormatAlign.LEFT:
				align = LEFT;
			case TextFormatAlign.RIGHT:
				align = RIGHT;
		}
		return align;
	}
	// }}}
	// {{{ public function setAlign( s : UXTextAlign ) : UXTextAlign
	/**
	 * 表示するアライン状態を設定します。
	 */
	public function setAlign( s : UXTextAlign ) : UXTextAlign
	{
		var fm = field.getTextFormat();
		switch ( s ) {
			case CENTER:
				fm.align = TextFormatAlign.CENTER;
			case JUSTIFY:
				fm.align = TextFormatAlign.JUSTIFY;
			case LEFT:
				fm.align = TextFormatAlign.LEFT;
			case RIGHT:
				fm.align = TextFormatAlign.RIGHT;
		}
		return s;
	}
	// }}}
	// }}}
	// {{{ public function new( ?t:String, ?fontsize:Int, ?color:Int, ?size:UXSize )
	/**
	* コンストラクタです。
	*
	* @param t: デフォルトのテキスト文字列を指定します。指定しない場合は空文字列です。
	* @param fontsize: フォントサイズです。
	* @param color: 文字列の色です。
	* @param size: テキストフィールドの幅、高さを指定します。
	*/
	public function new( ?t:String, ?fontsize:Int, ?color:Int, ?size:UXSize )
	{
		state = new UXTextFieldState();
		state.target = this;
		ctrl = new UXController<UXTextFieldState>( state );
		super(ctrl);

		field = new TextField();
		field.focusRect = null;
		field.type = TextFieldType.INPUT;
		field.border = true;
		field.borderColor = 0x999999;
		//field.background = true;
		//field.backgroundColor = 0xFFFFFF;
		if ( fontsize!=null ) {
			var fm:TextFormat = new TextFormat();
			fm.size = fontsize;
			field.defaultTextFormat = fm;
		}
		if ( color!=null ) {
			field.textColor = color;
		}
		if ( size!=null ) {
			field.width  = size.width;
			field.height = size.height;
		} else {
			field.autoSize = TextFieldAutoSize.LEFT;
		}
		field.text = t;
		addChild( field );
		ctrl.addUXChild( this );
		var me = this;
		field.addEventListener( FocusEvent.FOCUS_IN, function(fe){
			me.gotFocus();
		}, false, 0, true );
		field.addEventListener( FocusEvent.FOCUS_OUT, function(fe){
			me.lostFocus();
		}, false, 0, true );
		state.field = field;
	}
	// }}}
	// {{{ public function refreshResource() : Void
	/**
	 * テキストフィールドに対するグローバルなリソースを再取得する関数です。
	 */
	public function refreshResource() : Void
	{
	}
	// }}}
	// {{{ public function update( updator : UXTextFieldState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXTextFieldState -> Void ) : Void
	{
		updator( state );
	}
	// }}}
	// {{{ public function focus( ?mode : UXFocusHint ) : Void
	/**
	 * このオブジェクトにフォーカスを当てます。このオブジェクトがUXFocusMangerのインスタンスを持っていなければ、何もしません。
	 */
	override public function focus() : Void
	{
		super.focus();
		field.setSelection(0,field.text.length);
	}
	// }}}
	// {{{ public function getFocusee() : Dynamic
	/**
	 * このオブジェクトからフォーカス用のオブジェクトを取得します。
	 */
	override public function getFocusee() : Dynamic
	{
		return field;
	}
	// }}}
	// {{{ public function addUXEventListener( e:Dynamic, f:Dynamic->Void ) : Void
	/**
	* イベントリスナーを追加します。
	*/
	override public function addUXEventListener( e:Dynamic, f:Dynamic->Void ) : Void
	{
		addEventListener( e, f, false, 0, true );
	}

	// }}}
	// {{{ public function removeUXEventListener( e:Dynamic, f:Dynamic->Void ) : Void
	/**
	* イベントリスナーを削除します。
	*/
	override public function removeUXEventListener( e:Dynamic, f:Dynamic->Void ) : Void
	{
		removeEventListener( e, f );
	}

	// }}}
}
// }}}

// {{{ class UXInputInteraction extends UXGeneralInteraction<UXTextFieldState>
/**
 * UXInputInteraction クラス<br>
 * 文字入力を表すインタラクションです。
  */
class UXInputInteraction extends UXGeneralInteraction<UXTextFieldState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("Input");
	}

	// }}}
}
// }}}
